﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;

namespace VoidTank
{
    class Inimigo
    {
        //posição do inimigo no terreno
        public Vector3 posicao;

        //alcance visual do inimigo
        int visaoInimigo;

        //vetor direção na qual o inimigo está se movendo
        public Vector3 direcao;// { get; set; }

        //velocidade de movimento do inimigo
        public float velocidade{ get; set; }

        //modelo do inimigo
        public Model modelo { get; set; }

        //alvo do inimigo. Segundo seu comportamento, o inimigo caminha para um alvo randomico até que chegue a esta posição ou aviste o jogador.
        //Caso aviste o jogador, a posição deste passa a ser o novo alvo. Caso chegue ao alvo sem avistar o jogador um novo alvo será determinado.
        public Vector3 alvo;

        //Construtor da classe inimigo. Atribui alguns valores.
        public Inimigo()
        {
            this.posicao = Vector3.Zero;
            this.visaoInimigo = 20;
            this.alvo = this.posicao;
            this.velocidade = 0.1f;
        }

        //Método que verifica se uma posição P está dentro do alcance visual do inimigo (círculo centrado na posição do inimigo com raio lineOfSight).
        //retorna true ou false
        public bool isSeeing(Vector3 p)
        {
            //Checa se a posição P está dentro do alcance do círculo com centro na posição do inimigo
            if (((p.X - this.posicao.X) * (p.X - this.posicao.X) +
                 (p.Z - this.posicao.Z) * (p.Z - this.posicao.Z)) <= (this.visaoInimigo * this.visaoInimigo))
            {
                return true;
            }
            return false;
        }

        //Desenha o modelo na tela
        public void Draw(Matrix world, Matrix view, Matrix proj)
        {
            modelo.Draw(Matrix.CreateTranslation(this.posicao), view, proj);
        }

        //Desenha o modelo no Mapa
        public void DrawOnMap(Matrix world, Matrix view, Matrix proj)
        {
            modelo.Draw(Matrix.CreateTranslation(this.posicao), view, proj);
        }

        //Move o inimigo em direção ao jogador. Caso o jogador não esteja dentro do alcance visual, atribui uma posição randômica 
        //como alvo e move-se em direção a ela. Se já atingiu essa posição, atribui uma nova posição randômica.
        //Recebe como parâmetro a posição do jogador.
        public void move(Vector3 p)
        {
            //se está vendo o jogador, este passa a ser o alvo
            if (isSeeing(p))
            {
                this.alvo = p;
            }
            // Se não está vendo o jogador
            else
            {
                //se já chegou ao alvo
                if ((this.posicao.X > this.alvo.X - 2) &&
                    (this.posicao.X < this.alvo.X + 2) &&
                    (this.posicao.Z > this.alvo.Z - 2) &&
                    (this.posicao.Z < this.alvo.Z + 2))
                {
                    //obtem novo alvo
                    Random random = new Random(DateTime.Now.Millisecond);
                    float x = random.Next(0, 1000);
                    float z = random.Next(0, 1000);
                    this.alvo = new Vector3(x, 0, z);
                }
            }
            this.direcao = this.alvo - this.posicao;
            this.direcao.Normalize();

            this.direcao.X *= this.velocidade;
            this.direcao.Z *= this.velocidade;
            Matrix translation = Matrix.CreateTranslation(this.direcao);
            this.posicao = Vector3.Transform(this.posicao, translation);


        }

        //altera a posição do inimigo
        public void setPosition(Vector3 v)
        {
            this.posicao = v;
        }

        //atualiza o inimigo
        public void Update(Vector3 p)
        {
            //move-se buscando o jogador
            this.move(p);
        }
    }
}
